{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# LeNet on MNIST\n",
    "\n",
    "This is LeNet (6c-16c-120-84) on MNIST. Adam algorithm (lr=0.001) with 100 epoches.\n",
    "\n",
    "\n",
    "#### LeNet\n",
    "\n",
    "    Total params: 44,426\n",
    "    Trainable params: 44,426\n",
    "    Non-trainable params: 0\n",
    "\n",
    "\n",
    "####  LeNet with 10 intrinsic dim\n",
    "\n",
    "    Total params: 488,696\n",
    "    Trainable params: 10\n",
    "    Non-trainable params: 488,686\n",
    "    \n",
    "#### LeNet with 20000 intrinsic dim    \n",
    "    Total params: 888,584,426\n",
    "    Trainable params: 20,000\n",
    "    Non-trainable params: 888,564,426  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "import os, sys\n",
    "import numpy as np\n",
    "from matplotlib.pyplot import *\n",
    "import matplotlib.pyplot as plt\n",
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "\"\"\" Extract final stats from resman's diary file\"\"\"\n",
    "def extract_num(lines0, no_reg=False):\n",
    "\n",
    "    if no_reg:\n",
    "        valid_loss_str     = lines0[-5]\n",
    "        valid_accuracy_str = lines0[-6]\n",
    "        train_loss_str     = lines0[-8]\n",
    "        train_accuracy_str = lines0[-9]\n",
    "        average_time_str   = lines0[-10]        \n",
    "        run_time_str       = lines0[-11]   \n",
    "        \n",
    "    else: \n",
    "        valid_loss_str     = lines0[-6]\n",
    "        valid_accuracy_str = lines0[-7]\n",
    "        train_loss_str     = lines0[-10]\n",
    "        train_accuracy_str = lines0[-11]\n",
    "        average_time_str   = lines0[-12]        \n",
    "        run_time_str       = lines0[-13]\n",
    "\n",
    "\n",
    "    valid_loss     = float(valid_loss_str.split( )[-1])\n",
    "    valid_accuracy = float(valid_accuracy_str.split( )[-1])\n",
    "    train_loss     = float(train_loss_str.split( )[-1])\n",
    "    train_accuracy = float(train_accuracy_str.split( )[-1])\n",
    "    run_time       = float(run_time_str.split( )[-1])\n",
    "    \n",
    "    return valid_loss, valid_accuracy, train_loss, train_accuracy, run_time\n",
    "\n",
    "\n",
    "\"\"\" Extract number of total parameters for each net config from resman's diary file\"\"\"\n",
    "import locale\n",
    "def parse_num_params(lines0):\n",
    "    line_str = ''.join(lines0)\n",
    "    idx = line_str.find(\"Trainable params: \") # 19 for \"Trainable params: \"\n",
    "    param_str = line_str[idx+18:idx+18+10] # 14 is the length of string \"Total params: \"\n",
    "\n",
    "    param_num = param_str.split(\"\\n\")[0].replace(',','')\n",
    "    # print param_num\n",
    "    return int(param_num)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[  100   200   225   250   260   275   290   300   310   325   350   375\n",
      "   380   390   400   410   420   425   450   475   500   550   600  1000\n",
      "  1100  1200  1300  1400  1500  2000  2500  3000  3500  4000  4500  5000\n",
      " 10000 20000 30000 40000 44426]\n",
      "Baseline LeNet has trainable params:\n",
      "44426\n",
      "\n",
      "Baseline LeNet:\n",
      "(0.11051, 0.9902, 0.00256185, 0.99934, 39100.0)\n",
      "\n",
      "100 dim:\n",
      "(0.755928, 0.7543, 0.793199, 0.74802, 39100.0)\n",
      "\n",
      "200 dim:\n",
      "(0.398203, 0.8771, 0.426353, 0.86956, 39100.0)\n",
      "\n",
      "225 dim:\n",
      "(0.375239, 0.8909, 0.388398, 0.88282, 39100.0)\n",
      "\n",
      "250 dim:\n",
      "(0.343939, 0.8977, 0.371627, 0.88504, 39100.0)\n",
      "\n",
      "260 dim:\n",
      "(0.325455, 0.9018, 0.34523, 0.8957, 39100.0)\n",
      "\n",
      "275 dim:\n",
      "(0.327639, 0.9004, 0.339514, 0.8958, 39100.0)\n",
      "\n",
      "290 dim:\n",
      "(0.314797, 0.9086, 0.333205, 0.89804, 39100.0)\n",
      "\n",
      "300 dim:\n",
      "(0.303877, 0.9093, 0.322151, 0.90178, 39100.0)\n",
      "\n",
      "310 dim:\n",
      "(0.28405, 0.9141, 0.306001, 0.9068, 39100.0)\n",
      "\n",
      "325 dim:\n",
      "(0.276835, 0.9152, 0.295323, 0.91084, 39100.0)\n",
      "\n",
      "350 dim:\n",
      "(0.269061, 0.9196, 0.281595, 0.91412, 39100.0)\n",
      "\n",
      "375 dim:\n",
      "(0.26253, 0.9212, 0.263316, 0.9198, 39100.0)\n",
      "\n",
      "380 dim:\n",
      "(0.257582, 0.9214, 0.256241, 0.92252, 39100.0)\n",
      "\n",
      "390 dim:\n",
      "(0.258481, 0.9223, 0.264625, 0.91842, 39100.0)\n",
      "\n",
      "400 dim:\n",
      "(0.263222, 0.9201, 0.271297, 0.9186, 39100.0)\n",
      "\n",
      "410 dim:\n",
      "(0.256472, 0.9226, 0.258298, 0.9215, 39100.0)\n",
      "\n",
      "420 dim:\n",
      "(0.254516, 0.9229, 0.263038, 0.91996, 39100.0)\n",
      "\n",
      "425 dim:\n",
      "(0.260627, 0.9188, 0.268606, 0.91828, 39100.0)\n",
      "\n",
      "450 dim:\n",
      "(0.231096, 0.9289, 0.231628, 0.93128, 39100.0)\n",
      "\n",
      "475 dim:\n",
      "(0.225749, 0.9314, 0.226133, 0.93116, 39100.0)\n",
      "\n",
      "500 dim:\n",
      "(0.221013, 0.9312, 0.229151, 0.93078, 39100.0)\n",
      "\n",
      "550 dim:\n",
      "(0.193585, 0.941, 0.203666, 0.93788, 39100.0)\n",
      "\n",
      "600 dim:\n",
      "(0.190291, 0.9432, 0.187475, 0.9437, 39100.0)\n",
      "\n",
      "1000 dim:\n",
      "(0.122273, 0.96, 0.118149, 0.96414, 39100.0)\n",
      "\n",
      "1100 dim:\n",
      "(0.196947, 0.9638, 0.189519, 0.96716, 1100.0)\n",
      "\n",
      "1200 dim:\n",
      "(0.18953, 0.9645, 0.181086, 0.96812, 1200.0)\n",
      "\n",
      "1300 dim:\n",
      "(0.191177, 0.9647, 0.178061, 0.9694, 1300.0)\n",
      "\n",
      "1400 dim:\n",
      "(0.179073, 0.9682, 0.165761, 0.9727, 1400.0)\n",
      "\n",
      "1500 dim:\n",
      "(0.176727, 0.9687, 0.162696, 0.97328, 1500.0)\n",
      "\n",
      "2000 dim:\n",
      "(0.157298, 0.9751, 0.13959, 0.9802, 2000.0)\n",
      "\n",
      "2500 dim:\n",
      "(0.143958, 0.9763, 0.118883, 0.98492, 2500.0)\n",
      "\n",
      "3000 dim:\n",
      "(0.128868, 0.9805, 0.109107, 0.98744, 3000.0)\n",
      "\n",
      "3500 dim:\n",
      "(0.127314, 0.98, 0.101217, 0.98916, 3500.0)\n",
      "\n",
      "4000 dim:\n",
      "(0.125168, 0.9805, 0.0944868, 0.99066, 4000.0)\n",
      "\n",
      "4500 dim:\n",
      "(0.119914, 0.9832, 0.0893743, 0.99276, 4500.0)\n",
      "\n",
      "5000 dim:\n",
      "(0.119892, 0.9826, 0.0840595, 0.99408, 5000.0)\n",
      "\n",
      "10000 dim:\n",
      "(0.101472, 0.986, 0.0603562, 0.99818, 10000.0)\n",
      "\n",
      "20000 dim:\n",
      "(0.0906347, 0.9868, 0.0474075, 0.99834, 20000.0)\n",
      "\n",
      "30000 dim:\n",
      "(0.0807602, 0.9873, 0.0430896, 0.99784, 30000.0)\n",
      "\n",
      "40000 dim:\n",
      "(0.0858911, 0.9864, 0.0402109, 0.99758, 40000.0)\n",
      "\n",
      "44426 dim:\n",
      "(0.0892638, 0.9875, 0.0402495, 0.9973, 44426.0)\n",
      "\n",
      "0.89118\n",
      "Intrinsic dim is: 250 for LeNet\n"
     ]
    }
   ],
   "source": [
    "results_dir = '../results/lenet_mnist2'\n",
    "\n",
    "# dim = [10,50,100,500,1000,2000,5000,10000,15000,20000]\n",
    "# dim = [0,100,300,350,375,380,390,400,410,420,425,450,475,500,550,600,1000]\n",
    "i = 0        \n",
    "\n",
    "# filename list of diary\n",
    "diary_names = []\n",
    "for subdir, dirs, files in os.walk(results_dir):\n",
    "    for file in files:\n",
    "        if file == 'diary':\n",
    "            fname = os.path.join(subdir, file)\n",
    "            diary_names.append(fname)\n",
    "            \n",
    "dim_ = []            \n",
    "for f in diary_names: \n",
    "    if 'dir' not in f:\n",
    "        dim_.append( int(f.split('_')[-1].split('/')[0]) )         \n",
    "    \n",
    "dim = sorted(dim_) \n",
    "\n",
    "dim = np.array(dim) \n",
    "print dim\n",
    "\n",
    "diary_names_ordered = []\n",
    "for d in dim:\n",
    "    for f in diary_names:\n",
    "        if '_'+str(d)+'/' in f:\n",
    "            # print \"%d is in\" % d + f\n",
    "            diary_names_ordered.append(f)\n",
    "        if '_dir/' in f:\n",
    "            diary_names_dir = f            \n",
    " \n",
    "\n",
    "# extrinsic update  method\n",
    "with open(diary_names_dir,'r') as ff:\n",
    "    lines0 = ff.readlines()\n",
    "    R_dir = extract_num(lines0, True)\n",
    "\n",
    "print \"Baseline LeNet has trainable params:\\n\" + str(parse_num_params(lines0)) + \"\\n\"\n",
    "print \"Baseline LeNet:\\n\" + str(R_dir) + \"\\n\"\n",
    "\n",
    "\n",
    "# intrinsic update method\n",
    "trainable_param, Rs, Acc= [], [], []\n",
    "i = 0\n",
    "for fname in diary_names_ordered:\n",
    "    with open(fname,'r') as ff:\n",
    "        lines0 = ff.readlines()\n",
    "        d = int(fname.split('_')[-1].split('/')[0]) \n",
    "        # print d\n",
    "        \n",
    "        params = parse_num_params(lines0)\n",
    "        trainable_param.append(params)\n",
    "        if d < 1001:\n",
    "            R = extract_num(lines0, True)\n",
    "        else:    \n",
    "            R = extract_num(lines0, False)\n",
    "        Acc.append(R[1])    \n",
    "        print \"%d dim:\\n\"%dim[i] + str(R) + \"\\n\"\n",
    "        i += 1\n",
    "\n",
    "        Rs.append(R)\n",
    "                            \n",
    "Rs = np.array(Rs)\n",
    "Acc = np.array(Acc)   \n",
    "\n",
    "# 2.2 construct acc_solved_all and dim_solved_all           \n",
    "test_acc_bl = R_dir[1]\n",
    "print test_acc_bl*0.9\n",
    "for id_d in range(len(dim)):\n",
    "    d = dim[id_d]\n",
    "    r = Rs[id_d,1]\n",
    "\n",
    "    test_acc = r\n",
    "    if test_acc>test_acc_bl*0.9:\n",
    "        acc_solved=test_acc\n",
    "        dim_solved=d\n",
    "        print \"Intrinsic dim is: \" + str(d) + \" for LeNet\"\n",
    "        # print \"\\n\"\n",
    "        break\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(41, 5)\n",
      "41\n",
      "100,200,225,250,260,275,290,300,310,325,350,375,380,390,400,410,420,425,450,475,500,550,600,1000,1100,1200,1300,1400,1500,2000,2500,3000,3500,4000,4500,5000,10000,20000,30000,40000,44426\n",
      "[100, 0.7543],[200, 0.8771],[225, 0.8909],[250, 0.8977],[260, 0.9018],[275, 0.9004],[290, 0.9086],[300, 0.9093],[310, 0.9141],[325, 0.9152],[350, 0.9196],[375, 0.9212],[380, 0.9214],[390, 0.9223],[400, 0.9201],[410, 0.9226],[420, 0.9229],[425, 0.9188],[450, 0.9289],[475, 0.9314],[500, 0.9312],[550, 0.941],[600, 0.9432],[1000, 0.96],[1100, 0.9638],[1200, 0.9645],[1300, 0.9647],[1400, 0.9682],[1500, 0.9687],[2000, 0.9751],[2500, 0.9763],[3000, 0.9805],[3500, 0.98],[4000, 0.9805],[4500, 0.9832],[5000, 0.9826],[10000, 0.986],[20000, 0.9868],[30000, 0.9873],[40000, 0.9864],[44426, 0.9875]\n"
     ]
    }
   ],
   "source": [
    "print Rs.shape\n",
    "print len(dim)\n",
    "\n",
    "print ','.join(['%i' % dim[n] for n in xrange(len(Acc))])\n",
    "\n",
    "\n",
    "print ','.join(['[%i, %s]' % (dim[n], Acc[n]) for n in xrange(len(Acc))])\n",
    "\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Performance comparison with Baseline"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYsAAAFECAYAAADWXhLqAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3Xuc1HX99//HiwWRsxzkrCBkHlJS4OchskYzUS8TD1RA\nlJJfyCsUMPleQXKhYn7Fvph4rMSIFAXMRLRQkmTpKr7GIdEAWwUTWRQRkZMg7sLr98f7M8vssjsz\ny+zszO4+77fb3HY+59d8dpkX78/7ZO6OiIhIMo1yHYCIiOQ/JQsREUlJyUJERFJSshARkZSULERE\nJCUlCxERSUnJQkREUlKyEBGRlLKWLMxsppltNbM1VWw3M7vfzNab2etm1jdh2zVm9lb0uiZbMYqI\nSHosWz24zewrwB7gMXc/rZLtlwI3ApcCZwP3ufvZZtYOWAn0BxxYBfRz94+TXa9Dhw7es2fPmv0Q\nNeiTTz6hRYsWuQ6jSoovM4ovM4ovM5nEt2rVqm3ufmzKHd09ay+gJ7Cmim2/AoYmLBcBXYChwK+q\n2q+qV79+/TyfLVmyJNchJKX4MqP4MqP4MpNJfMBKT+P7vPERpaKa0Q3YlLBcHK2rav1hzGwUMAqg\nU6dOFBYWZiXQmrBnzx7FlwHFlxnFlxnFR06TRcbc/RHgEYD+/ft7LBbLbUBJFBYWoviOnOLLjOLL\njOLLbWuozcBxCcvdo3VVrRcRkRzJZbJ4Dvhe1CrqHGCnu78PLAIuMrO2ZtYWuChaJyIiOZK1x1Bm\nNgeIAR3MrBi4FWgC4O6/BBYSWkKtB/YCI6Jt283sDmBFdKop7r49W3GKiEhqWUsW7j40xXYHRlex\nbSYwMxtxiYhI9akHt4iIpKRkISIiKSlZiIhISnW6n0WioqKivG4HvWPHDo455phch1ElxZcZxZcZ\nxZeZ2ohPJQsREUktnTFB6sJLY0NlRvFlRvFlRvFlpjbGhlLJQkREUlKyEBGRlJQsREQkJSULERFJ\nSclCRERSUrIQEZGUlCxERCQlJQsREUlJyUJERFJSshARqYM2bICxY6FjR/ja175Kx45hecOG7FxP\nyUJEpI554QU46yzYvRtmzIBly4wZM8LyWWeF7TWt3ow6KyLSEGzYAMOHw7Rp0KfPofXdu8Po0XDe\neWH78uXQu3fNXVclCxGROuT++2HQoPKJIlGfPmH7Aw/U7HWVLERE6pA5c0IySGbQIHjyyZq9rpKF\niEgd8tFH0Llz8n06d4bt22v2ukoWIiJ1SPv2sGVL8n22bIF27Wr2ukoWInJEEptuFhRQ7aabtd30\ns74YOhQWLEi+z4IFMGxYzV5XyUJEqu3wpptUq+lmLpp+1hdjxoRk8PrrlW9//fWw/cYba/a6ajor\nItWSadPNXDX9rC9694bZs8M9GjQovDp3Do+eFiwIr9mza/7eqWQhItWSadPNXDX9rE8uuSQk09at\nYeRIGDDAGTkyLC9fHrbXNCULkTqqJusMqnN8pk03c9X0s77p3RumT4etW2Hx4qVs3RqWs1UaU7IQ\nyZFMvuxrvs4g/eMzbbqZq6afkhklC5EcyOTLOvGZ/+jR4Vl/48aHnvlPmxa2V5V0Mj0+06abuWr6\nKZlRshCpZZl+Wee6ziDTppu5avopmVGyEKllmX5Z57rOINOmm7lq+imZUbIQOUJH2qks0y/rXNcZ\nxJtujh8PDz0ExcVQWhp+PvRQWJ+s6Wamx0tuKFmIHIFMOpVl+mWdD3UGhzfdpFpNN3PR9FMyo2Qh\nUk25riDOlzqDxKabpaVUu+lmbTf9lMwoWYhUU64riFVnILmgZCFSTbmuIFadgeSCxoYSqaaaqiDO\nZGyf+DP/Bx4Iz/y3bw+PrYYNS29MpUyPl4ZHyUKkmuJ1Dt27V71PuhXEmXxZx5/5T59e/c9QE8dL\nw6LHUCLVlC8VxCK1SSULkWoaMyY0jz3vvMorueN1DsuX135sItmiZCFSTbmaT0Akl/QYSuQIqFOZ\nNDRKFiJHSJ3KpCHJarIws4vNrMjM1pvZhEq29zCzP5vZ62ZWaGbdE7YdMLPV0eu5bMYpIiLJZa3O\nwswKgIeArwPFwAoze87d1yXsNg14zN1/a2YXAHcB34227XP3M7IVn4iIpC+bJYuzgPXu/ra7fwbM\nBSr2ez0VeDl6v6SS7SIikgfM3bNzYrPBwMXu/h/R8neBs939hoR9ngT+7u73mdlVwO+BDu7+kZmV\nAquBUmCquz9byTVGAaMAOnXq1G/u3LlZ+Sw1Yc+ePbRs2TLXYVRJ8WVG8WVG8WUmk/jOP//8Ve7e\nP+WO7p6VFzAYeDRh+bvAgxX26Qo8A7wK3Ed4XHVMtK1b9LMX8A7QO9n1+vXr5/lsyZIluQ4hKcWX\nGcWXGcWXmUziA1Z6Gt/p2exnsRk4LmG5e7SujLu/B1wFYGYtgavdfUe0bXP0820zKwTOBNKYyl5E\nRGpaNussVgAnmtkJZnYUMAQo16rJzDqYWTyGicDMaH1bM2sa3wcYACRWjEseSJwprqCAtGeKE5G6\nJ2vJwt1LgRuARcAbwFPuvtbMppjZ5dFuMaDIzN4EOgF3RutPAVaa2WuEiu+pXr4VleTY4TPFkfZM\ncSJS92R1uA93XwgsrLBucsL7p4GnKzluGXB6NmOT1DZsCBP9zJkThuVu3z4Mojdo0KGZ4hLHRorP\nFHfeeWG7hroWqT/Ug1sqlazkMGgQXH75kc8UJyJ1j5KFHCbVHNMFBXDFFcnPkWymOBGpe5Qs5DCp\n5pjevTuzmeJEpO5RspDDpJpj+phjwnDcyaSaKU5E6hYlCzlMqjmmBw6EZw/rT19eOjPFiUjdoWQh\nh4nPMV2Vb38b5s8PM8JVJj5T3I03Zic+Eal9ShZymFRzTHfvHlpKjRkDDz0ExcVhDuni4rA8frxm\nihOpb5Qs5DBjxoRkkazksGpV2OfQTHFopjiRekxzcMth0p1j+oILwmv69FxHLCLZppJFA1JxLKf2\n7aFfP+jQAb72ta+WG9vp8DmmVXIQaciULBqIij2yp02DAwfgtNPg17+GZcvssLGdEueYLi1Fc0yL\nNGB6DNUAJPbI7tMnVERPmQL33quxnUQkPSpZ1GPxx05nngmXXnooMcybB1deqbGdRCR9Shb1VOJj\np4ICGDz40LZFi5L30AaN7SQi5SlZ1EMVBwLctat8j+wdOzS2k4hUj5JFPVRxIMCKYzlpbCcRqS4l\ni3qo4kCAAweW75FdcbkyGttJRBIpWdRDFQcCrDiWk8Z2EpHqUrKogxI71zVqFDrKtWwJRx0FzZpB\nkyblHzN17w633w4/+hE8+GBYN3ky3HQT3HefxnYSkdSULOqYmTPhjDNC5fP110ObNnD22WEmu+98\nB+bODc1iKw4hPmAAzJoFn30G110XEkJpKaxbF5YHDHD10BaRKqlTXh0ydWooITz8cKh8vvZamDAh\nrE/sYDdkSNj2la8c3unuRz+CCy8MySKx011h4VJisVgtfyIRqSuULPLYhg2hZdOcOfDhh3D00aG+\noU8fuOeeMA/2a68d3sEu8bHTFVeEV2UDAeoxk4ikS4+h8lRip7opU6BFi/Co6corw/Y//jEkgcQO\ndsXFIYlcdFGoj3APpYdrroFzz9VAgCJy5FSyyEMVx3K65x4wg717QwmhuDgkkc6dD3Ww+9vf4NZb\nQzKZObN8SWL+/HD81q25/mQiUlcpWeShip3qFi0KiaJNm5AA5s0LJY0tW0IHu1dfDYni5z+vemDA\nH/4wJCE9ehKRI6HHUHmoYqe6HTtCovjyl0NJYdEiOP/88H7gwFDhnWpgwG9+UwMDisiRU7LII/H+\nE9u2le9Ud8wxIVEcdVR4pLRjR6iHmD8fvvhFePPN1AMDXn21BgYUkSOnZJFj8QTRpk2YiGj79kOP\nm+IGDgyJ4s9/Dk1imzQJld233x6azX72mQYGFJHsSpkszOz02gikIYq3eNq8OVRAP/wwjBsXWiol\njt307W8fShSzZkHPnvDMM4c62jVvroEBRSS70ilZPGxmy83sh2bWJusRNRCJLZ6OOgquuupQnUPF\nsZvi/SZmzYILLgjLTz0VtnfvDpdfroEBRSS7UiYLdz8P+A5wHLDKzJ40s69nPbJ6LrHFU8XJiCqO\n5VRcHIb0uOsueOut0Ex2//7Qwum++0JPbQ0MKCLZlFadhbu/BUwCfgx8FbjfzP5lZldlM7j6LLHF\nU2WTEVUcy2nAgPCI6oILYM0aOHgw/GzXLgwKuGvXoeShgQFFpKalU2fRx8zuBd4ALgC+4e6nRO/v\nzXJ89VbiMOJVTUYUH8tp0SL4/e9D7+vp0w996ffuHZa3boUDBw4lj5EjQ3JRj20RqSnplCweAP4B\nfNHdR7v7PwDc/T1CaUOqacOGMJR4PEHU1GREicmjtDT8TEwuIiJHKp1k8b+AJ919H4CZNTKz5gDu\n/ng2g6uPXngB+vUL4zbNnx/WaTIiEcl36SSLxUCzhOXm0TqppngLqLPPPtQ8Nt6iqWKFdrzO4cEH\nVecgIrmXzthQR7v7nviCu++JlyykeuItoBYsCIP9feUr5YcRf/RReOyxkFA++QSaNoUf/KD8vBMi\nIrmQTsniEzPrG18ws37AvuyFVH/FW0DFWz9VbPH07W+HZrGXXw6/+x2UlKjOQUTyQzoli3HA78zs\nPcCAzsC3sxpVPRVvARVv/dS9+6EWTz/6Ufl9i4vV41pE8kfKZOHuK8zsZOCkaFWRu5dkN6z6qX37\nkCTirZ9Gj656X/W4FpF8ku58FicBpwJHA33NDHd/LHth1R/xqVEff/zL7NkDTz8dHjdde22YZ6Ky\nYcXjrZ+WL6/1cEVEKpVOp7xbCX0tHgDOB34GXJ7luOqFxKlRf/Obxtx7b2giu3171a2f7r0Xbr5Z\nrZ9EJL+kU7IYDHwReNXdR5hZJ2B2dsOq+ypOjRqf9vRLXwrzY19xRRjraelSGDECdu4MAwpecgms\nWKFEISL5JZ1ksc/dD5pZqZm1BrYSBhWUJBIHCiwuLj/taXFxGDV20qTQMqpVqzDM+IIFYewnEZF8\nk07T2ZVmdgwwA1hFGPrjf9I5uZldbGZFZrbezCZUsr2Hmf3ZzF43s0Iz656w7Rozeyt6XZPm58kb\nc+aER1BTp8LgwSEp3HhjWIZDYz79/e+weHGY9vS553Ibs4hIVZImCzMz4C533+HuvwS+Dlzj7iNS\nndjMCoCHgEsIleNDzezUCrtNAx5z9z7AFOCu6Nh2wK3A2cBZwK1m1rZanyzHtm0Lj5uefTbUR0Do\naPfsszBkSHgslWjQIE17KiL5K2mycHcHFiYsv+PuVYxgdJizgPXu/ra7fwbMBSrOFH0q8HL0fknC\n9oHAS+6+3d0/Bl4CLk7zujn38sth7KdPPz2UKOJKS8P6H/84PI6K07SnIpLP0qmz+IeZ/X/uvqKa\n5+4GbEpYLiaUFBK9BlwF3AdcCbQys/ZVHNut4gXMbBQwCqBTp04UFhZWM8TsGDmyP9CC0IexcqWl\n8MQTIWlA6H/Rpk0phYV/rZUYK9qzZ0/e3L/KKL7MKL7MKL70ksXZwHfMbCPwCeEb0KNHR5kaDzxo\nZtcCfwE2AwfSPdjdHwEeAejfv7/HYrEaCClz//536n1KS2HhwkPJYsEC+O53G5Orz1BYWJiza6dD\n8WVG8WVG8aWXLAYe4bk3U77VVPdoXZloToyrAMysJXC1u+8ws81ArMKxhUcYR61zT2+/vXvDT3XC\nE5F8l05rKK/ilcoK4EQzO8HMjgKGAOXa+5hZBzOLxzARmBm9XwRcZGZto4rti6J1dYJV/fSpnGbN\nNO2piNQN6ZQs/khIDkYY7uMEoAj4QrKD3L3UzG4gfMkXADPdfa2ZTQFWuvtzhNLDXWbmhMdQo6Nj\nt5vZHYSEAzDF3fO++jc+tEfjxuExU6oSRknJoWlPlShEJJ+lM5Dg6YnL0XDlP0zn5O6+kITWVNG6\nyQnvnwaeruLYmRwqaeS9F14IPbYHDYL/+39h8uTUx7z4ojrhiUjdkO5AgmXc/R9mVrFVU4NWcWgP\ngM2b4Ve/Co+kEksY8eXbb1eiEJG6I2WyMLPEmRYaAX2B97IWUR2UOLRH3MiRcMYZYYiP9eshdFkx\nTj89DBaoRCEidUk6FdytEl5NCXUYFTvX5VxRURGzZs0CoKSkhFgsxuzZYbzDvXv3EovFmDdvHgA7\nd+4kFovxzDPPALBt2zZisRjPP/88AFu2bCEWi/Hiiy8CsGnTJmKxGIsXh6nH3377bWKxGEuXLgXg\n8ceLWL48xmuvLQNg/fo1jBoVo3nzFcyZA7Nnr+YLXziftm1X89pr0KrVCmKxGGvWrAFg2bJlxGIx\nioqKAFi6dCmxWIy3334bgMWLFxOLxdi0KXQ9efHFF4nFYmzZsgWA559/nlgsxrZt2wB45plniMVi\n7Ny5E4B58+YRi8XYGzW/mj17NrFYjJKSMC3JrFmzGDduXNm9nDFjBhdeeGHZ8sMPP8wll1xStnzf\nffdx+eWHBh6eNm0aV199ddny1KlTGTJkSNnyHXfcwfDhw8uWJ0+ezIgRhwYBmDhxIqNGjSpbHj9+\nPKMTJvsYN24cDz74YNny6NGjGT9+fNnyqFGjmDhxYtnyiBEjmJzwHHD48OHccccdZctDhgxhanzc\nFeDqq69m2rRpZcuXX3459913X9nyJZdcwsMPP1y2fOGFFzJjxoyy5cS/ldr+2ysqKiIWi7FsWfjb\nW7NmDbFYjBUrQnXf6tWricVirF+/HoAVK/Lvby+xyWc+/u0l/tvIx7+9TL/30pVOncXtaZ+tgdqx\nA3r2TL7PUUeFkWVFROoi8xRNdszsJeCb7r4jWm4LzHX3I+1/kRX9+/f3lStX5uTaHTvCjBlhitSq\nFBeHR1Nbt9ZeXNWhTkeZUXyZUXyZySQ+M1vl7v1T7ZfOY6hj44kCIBqrqeMRRVVPDR0aOtUlM3/+\nQU2TKiJ1VjqtoQ6Y2fHu/i6EYcVJr1NegzFmTBiOPPk0qU6OCj4iIhlLJ1ncAvzVzJYSOuadRzR4\nnwS9e4ce2PF+FoMGhVFkt2wJJY4FC2DChLX07l0Tw2mJiNS+dCq4X4w64p0TrRrn7tuyG1bdc8kl\noSf2Aw+Euont26FdOxg2LKzftCnvO6CLiFQpnX4WVwIvu/sfouVjzOwKd38269HVMb17w/Tp4VXR\npk2HrxMRqSvSqeC+1d3LGn1Gld23Zi8kERHJN+kki8r2qfYwISIiUnelkyxWmtnPzax39Po5sCrb\ngYmISP5IJ1ncCHwGzIte+4mGEm/oNmyAsWNDp7yCgvBz7NiwXkSkPkmZLNz9E3ef4O79o9dEd/+k\nNoLLZy+8EPpW7N4dem8vWxZ+7t4d1r/wQq4jFBGpOem0hjoW+D+EyY6Ojq939wY7bmplQ5JDGO5j\n9OjQOW/4cE1qJCL1RzqPoZ4A/kWYIe924B0OzWDXIFU2JHmiPn3C9gceqN24RESyJZ1k0d7dfw2U\nuPtSd/8+0GBLFQBz5oRkkMygQfDkk7UTj4hItqXTBLYk+vm+mf0vwsRH7bIXUv776KMwnEcynTuH\nXtwiIvVBOsnip2bWBrgZeABoDdyU1ajyXPv2YdynZEOSb9kShvsQEakP0mkN9Qd33+nua9z9fHfv\n5+7P1UZw+SqdIckXLEBDkotIvaGe2EcgvSHJQ2soEZH6QMniCKQzJPns2Wo2KyL1RzqtoaQS8SHJ\nW7cOQ5IPGBB+tm4d1ifMMS8iUuel0ymvKXA10DNxf3efkr2w6oZkQ5KLiNQn6TyGWgDsJAweuD+7\n4YiISD5KJ1l0d/eLsx6JiIjkrXTqLJaZ2elZj0RERPJWOiWLLwPXmtm/CY+hDHB3r2JkJBERqW/S\nSRZq1yMi0sCl04N7I3AM8I3odUy0TkREGoiUycLMxhKGKe8YvWab2Y3ZDkxERPJHOo+hrgPOjs+O\nZ2Z3A/9DGFRQREQagHRaQxlwIGH5QLROREQaiHRKFr8B/m5m86PlK4BfZy8kERHJNymThbv/3MwK\nCU1oAUa4+6tZjUpERPJKlcnCzFq7+y4za0eYd/udhG3t3F3zwImINBDJShZPApcRxoTyhPUWLffK\nYlwiIpJHqkwW7n5Z9POE2gtHRETyUTr9LP6czjoREam/ktVZHA00BzqYWVsONZdtDXSrhdhERCRP\nJKuz+AEwDuhKqLeIJ4tdwINZjktERPJIsjqL+4D7zOxGd1dvbRGRBiydfhYPmNlpwKnA0QnrH0t1\nrJldDNwHFACPuvvUCtuPB35LGKiwAJjg7gvNrCfwBlAU7fqKu1+fzgcSEZGal84c3LcCMUKyWEgY\nsvyvQNJkYWYFwEPA14FiYIWZPefu6xJ2mwQ85e6/MLP4+XtG2za4+xnV+jQiIpIV6YwNNRj4GrDF\n3UcAXwTapHHcWcB6d3/b3T8D5gKDKuzjhApzonO+l1bUIiJSq8zdk+9gttzdzzKzVcD5wG7gDXc/\nOcVxg4GL3f0/ouXvEkavvSFhny7An4C2QAvgQndfFT2GWgu8SahQn+Tu/6+Sa4wCRgF06tSp39y5\nc9P60LmwZ88eWrZsmeswqqT4MqP4MqP4MpNJfOeff/4qd++fckd3T/oCHibUKVwPvAW8CvwmjeMG\nE+op4svfBR6ssM+PgJuj9+cC6wilnaZA+2h9P2AT0DrZ9fr16+f5bMmSJbkOISnFlxnFlxnFl5lM\n4gNWeorvc3dPq4L7h9HbX5rZi9GX9utpJKzNwHEJy92jdYmuAy6OrvM/Ud+ODu6+lTDfNx5KGhuA\nzwMr07iuiIjUsGSd8vom2+bu/0hx7hXAiWZ2AiFJDAGGVdjnXUJ9yCwzO4XQ2upDMzsW2O7uB8ys\nF3Ai8HbKTyMiIlmRrGRxT/TzaKA/8BqhY14fwv/wz012YncvNbMbgEWEZrEz3X2tmU0hFHueA24G\nZpjZTYTK7mvd3c3sK8AUMysBDgLXu0a5FRHJmWSd8s4HMLNngL7u/s9o+TTgtnRO7u4LCc1hE9dN\nTni/DhhQyXG/B36fzjVERCT70mk6e1I8UQC4+xrglOyFJCIi+SadaVVfN7NHgdnR8neAdCq4RUSk\nnkgnWYwA/jcwNlr+C/CLrEUkIiJ5J52ms58C90YvERFpgJI1nX3K3b9lZv+k/LSqALh7n6xGJiIi\neSNZySL+2Omy2ghERETyV7Kms+9HPzfWXjgiIpKPkj2G2k0lj58IHfPc3VtXsk1EROqhZCWLVrUZ\niIiI5K90ms4CYGYdKT9T3rtZiUhERPJOyh7cZna5mb0F/BtYCrwDvJDluEREJI+kM9zHHcA5wJvu\nfgJhlNhXshqViIjklXSSRYm7fwQ0MrNG7r6EMAqtiIg0EOnUWewws5aEYT6eMLOtwCfZDUtERPJJ\nOiWLQcA+4CbgRWAD8I1sBiUiIvklWT+Lh4An3f1vCat/m/2QREQk3yQrWbwJTDOzd8zsZ2Z2Zm0F\nJSIi+aXKZOHu97n7ucBXgY+AmWb2LzO71cw+X2sRiohIzqWss3D3je5+t7ufCQwFrgDeyHpkIiKS\nN9LplNfYzL5hZk8QOuMVAVdlPTIREckbySq4v04oSVwKLAfmAqPcXc1mRUQamGT9LCYCTwI3u/vH\ntRSPiIjkoWSjzl5Qm4GIiEj+SqdTnoiINHBKFiIikpKShYiIpKRkISIiKSlZiIhISkoWIiKSkpKF\niIikpGQhIiIpKVmIiEhKShYiIpKSkoWIiKSkZCEiIikpWYiISEpKFiIikpKShYiIpKRkISIiKSlZ\niIhISkoWIiKSkpKFiIikpGQhIiIpZTVZmNnFZlZkZuvNbEIl2483syVm9qqZvW5mlyZsmxgdV2Rm\nA7MZp4iIJNc4Wyc2swLgIeDrQDGwwsyec/d1CbtNAp5y91+Y2anAQqBn9H4I8AWgK7DYzD7v7gey\nFa+IiFQtmyWLs4D17v62u38GzAUGVdjHgdbR+zbAe9H7QcBcd9/v7v8G1kfnExGRHMhmsugGbEpY\nLo7WJboNGG5mxYRSxY3VOFZERGpJ1h5DpWkoMMvd7zGzc4HHzey0dA82s1HAKIBOnTpRWFiYnShr\nwJ49exRfBhRfZhRfZhQf4O5ZeQHnAosSlicCEyvssxY4LmH5baBjxX2BRcC5ya7Xr18/z2dLlizJ\ndQhJKb7MKL7MKL7MZBIfsNLT+E7P5mOoFcCJZnaCmR1FqLB+rsI+7wJfAzCzU4CjgQ+j/YaYWVMz\nOwE4EViexVhFRCSJrD2GcvdSM7uBUCooAGa6+1ozm0LIZM8BNwMzzOwmQmX3tVGmW2tmTwHrgFJg\ntKsllIhIzmS1zsLdFxIqrhPXTU54vw4YUMWxdwJ3ZjM+ERFJj3pwi4hISkoWIiKSkpKFiIikpGQh\nIiIpKVmIiEhKShYiIpKSkoWIiKSU67GhRKQB2rVrF1u3bqWkpASANm3a8MYbb+Q4qqrV9fhatGhB\n9+7dadToyMsHShYiUqt27drFBx98QLdu3WjWrBlmxu7du2nVqlWuQ6tSXY7v4MGDbN68mW3bttGx\nY8cjvoYeQ4lIrdq6dSvdunWjefPmmFmuw6n3GjVqRKdOndi5c2dm56mheERE0lJSUkKzZs1yHUaD\n0qRJE0pLSzM6h5KFiNQ6lShqV03cbyULERFJSclCRCRBz549Wbx4ca1dz8xYv349ANdffz133HFH\nrV27OtQaSkQkT/zyl7/MdQhVUslCRERSUrIQEalgxYoVnHrqqbRt25YRI0bw6aef8vHHH3PZZZdx\n7LHH0rZtWy677DKKi4vLjpk1axa9evWiVatWnHDCCTzxxBNl22bOnMkpp5xC27ZtGThwIBs3bqz0\nutdeey2TJk0CoLCwkO7du3PPPffQsWNHunTpwm9+85uyfffv38/48eM5/vjj6d27N9dffz379u3L\n0h3RYygRybFx48axatUqCgoKsnaNM844g+nTp6e9/xNPPMGiRYto0aIF3/jGN/jZz37GhAkTGDFi\nBE899RQHDhzg+9//PjfccAPPPvssn3zyCWPGjGHFihWcdNJJvP/++2zfvh2ABQsW8F//9V88//zz\nnHjiiUxVA0X8AAATM0lEQVSdOpWhQ4eybNmylHFs2bKFnTt3snnzZl566SUGDx7MFVdcQdu2bZkw\nYQIbNmxg9erVfPrpp/zgBz9gypQp3HXXXUd8n5JRyUJEpIIbbriB4447jnbt2nHLLbfw9NNP0759\ne66++mqaN29Oq1atuOWWW1i6dGnZMY0aNWLNmjXs27ePLl268IUvfAEI9RATJ07klFNOoXHjxvzk\nJz9h9erVVZYuEjVp0oTJkyfTpEkTLr30Ulq2bElRURHuziOPPMK9995Lu3btaNWqFT/5yU+YO3du\n1u6JShYiklPTp0/Pu+E0jjvuuLL3PXr0YMuWLezdu5ebbrqJF198kY8//hgIw2wcOHCAFi1aMG/e\nPKZNm8Z1113HgAEDuOeeezj55JPZuHEjY8eO5eabby47p7uzefNmevTokTSO9u3b07jxoa/p5s2b\ns2fPHj788EP27t1Lv379yp3zwIEDNXULDqOShYhIBZs2bSp7/+6779K5c2fuueceioqK+Pvf/86u\nXbv4y1/+AoQvaYCBAwfy0ksv8f7773PyySczcuRIICSeX/3qV+zYsaPstW/fPr70pS8dcXwdOnSg\nWbNmrF27lh07drBp0yZ27tzJnj17MvjUySlZiIhU8NBDD1FcXMz27du58847ufrqq9m9ezfNmjXj\nmGOOYfv27dx+++1l+3/wwQcsWLCATz75hKZNm9KyZcuyEV6vv/567rrrLtauXQvAzp07+d3vfpdR\nfI0aNWLkyJHcdNNNbN26FYDNmzezaNGijM6b9JpZO7OISB01bNgwLrroInr16kXv3r35z//8T8aN\nG8e+ffvo0KED55xzDhdffHHZ/gcPHuTnP/85Xbt2pV27dixdupRf/OIXAFx55ZX8+Mc/ZsiQIbRu\n3ZrTTjuNF154IeMY7777bj73uc9xzjnn0K1bNy688EKKiooyPm+V3L1evPr16+f5bMmSJbkOISnF\nlxnFl75169Ydtm7Xrl05iCR99SG+yu67uzuw0tP4jlXJQkREUlKyEBGRlJQsREQkJSULERFJSclC\nRERSUrIQEZGUlCxERCQlJQsREUlJyUJEJEPxuSdq2jvvvIOZUVpaWuPnri4lCxERSUnJQkREUlKy\nEBGp4O6776Zbt260atWKk046icLCQvbv38+4cePo2rUrXbt2Zdy4cezfv7/SYwcPHlxu3dixYxkz\nZgwQRp297rrr6NKlC926dWPSpEll81AcOHCA8ePH06FDB3r16sUf//jH7H/YNClZiEjOXXrppcya\nNQuAkpISYrEYs2fPBmDv3r3EYjHmzZsHhC/bWCzGM888A8C2bduIxWI8//zzQJiKNBaL8eKLLwLl\n56ZIR1FREQ8++CArVqxg9+7dLFq0iOOPP54777yTV155hdWrV/Paa6+xfPlyfvrTnx52/JAhQ1i4\ncCG7d+8GQgJ46qmnGDZsGBDm2W7cuDHr16/n1Vdf5U9/+hOPPvooADNmzOAPf/gDr776KitXruTp\np5+uVuzZ1KCTxYYNMHYsdOwIBQXh59ixYb2INEwFBQXs37+fdevWUVJSQs+ePenVqxdPPPEEkydP\npmPHjhx77LHceuutPP7444cd36NHD/r27cv8+fMBePnll2nevDnnnHMOH3zwAQsXLmT69Om0aNGC\njh07ctNNN5VNh/rUU08xbty4sildJ06cWKufPZkGO63qCy/A8OEwaBDMmAGdO8OWLbBgAZx1Fsye\nDZdckusoRRqGhQsXlk2r2qRJEwoLC8u2NW/evNxymzZtyi136NCh3HLnzp3LLSdOkZqOz33uc0yf\nPp3bbruNtWvXMnDgQKZMmcJ7771XbhrUHj168N5771V6jmHDhjFnzhy+973v8eSTT5aVKjZu3EhJ\nSQldunQp2/fgwYNlMb733nuHTemaLxpkyWLDhpAopk2D0aOhe3do3Dj8HD06rB8+XCUMkYZq2LBh\n/PWvf2Xjxo2YGZMnT6Zr165s3LixbJ93332Xrl27Vnr8N7/5TQoLCykuLmb+/PllyeK4446jadOm\nbNu2rWyK1V27dpXNotelS5fDpnTNFw0yWdx/fyhR9OlT+fY+fcL2Bx6o3bhEJPeKiop4+eWX2b9/\nP0cffTTNmjWjUaNGDB06lJ/+9Kd8+OGHbNu2jSlTpjB8+PBKz3HssccSi8UYMWIEJ5xwAqeccgoQ\nksFFF13EzTffzK5duzh48CAbNmxg6dKlAHzrW9/i/vvvp7i4mI8//pipU6fW2udOpUEmizlzQjJI\nZtAgePLJ2olHRPLH/v37mTBhAh06dKBz585s3bqV2267jUmTJtG/f3/69OnD6aefTt++fZk0aVKV\n5xk2bBiLFy8uK1XEPfbYY3z22WeceuqptG3blsGDB/P+++8DMHLkSAYOHMgXv/hF+vbty1VXXZXV\nz1odFmbVq/v69+/vK1euTGvfggJYtiw8eqpKaSkMGBB+1oTCwkJisVjNnCwLFF9mFF/63njjjbL/\nacft3r27rM4iH9WH+Cq77wBmtsrd+6e6RoMsWbRvHyqzk9myBdq1q514RETyXVaThZldbGZFZrbe\nzCZUsv1eM1sdvd40sx0J2w4kbHuuJuMaOjS0ekpmwQKoUHoUEWmwstZ01swKgIeArwPFwAoze87d\n18X3cfebEva/ETgz4RT73P2MbMQ2ZkxoHnveeZVXcr/+ekgWy5dn4+oiInVPNvtZnAWsd/e3Acxs\nLjAIWFfF/kOBW7MYT5nevUM/ing/i0GDyvezWLAgbO/duzaiEWl43B0zy3UYDUZN1E1nrYLbzAYD\nF7v7f0TL3wXOdvcbKtm3B/AK0N3dD0TrSoHVQCkw1d2freS4UcAogE6dOvWL94JM1+bNR/Pss915\n+eXO7NxZQJs2B7jggi1ccUUx3bp9Wq1zpbJnzx5atmxZo+esSYovM4ovfa1bt+b444+nadOmZesO\nHDhAQUFBDqNKrq7HV1JSwjvvvMOuXbsO23b++eenVcGdLz24hwBPxxNFpIe7bzazXsDLZvZPdy/X\nTc7dHwEegdAa6khae3znO4lLjYHu0atm5VNrlMoovswovvTt2rWLDz74gG7dutGsWTPMrF60Nsql\nZPEdPHiQzZs30717dzp27HjE18hmstgMJPaz7x6tq8wQYHTiCnffHP1828wKCfUZ6lMtUse1bt0a\nCENblJSUAPDpp59y9NFH5zKspOp6fC1atKBDhw4ZXSObyWIFcKKZnUBIEkOAw9oXmdnJQFvgfxLW\ntQX2uvt+M+sADAB+lsVYRaQWtW7duixpQCj5nHnmmUmOyC3Fl8Vk4e6lZnYDsAgoAGa6+1ozmwKs\ndPd4c9ghwFwvX3lyCvArMztIaN47NbEVlYiI1K6s1lm4+0JgYYV1kyss31bJccuA07MZm4iIpK9B\n9uAWEZHqUbIQEZGU6s1Agmb2IbAx5Y650wHYlusgklB8mVF8mVF8mckkvh7ufmyqnepNssh3ZrYy\nnY4vuaL4MqP4MqP4MlMb8ekxlIiIpKRkISIiKSlZ1J5Hch1ACoovM4ovM4ovM1mPT3UWIiKSkkoW\nIiKSkpKFiIikpGRRA8zsODNbYmbrzGytmY2N1t9mZpsTpoe9NOGYidF0s0VmNrAWYnzHzP4ZxbEy\nWtfOzF4ys7ein22j9WZm90fxvW5mfbMc20kJ92i1me0ys3G5vH9mNtPMtprZmoR11b5fZnZNtP9b\nZnZNluP7bzP7VxTDfDM7Jlrf08z2JdzHXyYc0y/6u1gffYYamZGoiviq/fu0FFMz13B88xJie8fM\nVkfrc3H/qvpOyd3foLvrleEL6AL0jd63At4ETgVuA8ZXsv+pwGtAU+AEwtDrBVmO8R2gQ4V1PwMm\nRO8nAHdH7y8FXgAMOAf4ey3eywJgC9Ajl/cP+ArQF1hzpPcLaAe8Hf1sG71vm8X4LgIaR+/vToiv\nZ+J+Fc6zPIrZos9wSRbjq9bvM3ptAHoBR0X7nJqt+CpsvweYnMP7V9V3Ss7+BlWyqAHu/r67/yN6\nvxt4A+iW5JBBhJF297v7v4H1hGloa9sg4LfR+98CVySsf8yDV4BjzKxLLcX0NWCDuyfrjZ/1++fu\nfwG2V3Ld6tyvgcBL7r7d3T8GXgIuzlZ87v4ndy+NFl8hxSxeUYyt3f0VD98sjyV8phqPL4mqfp9l\nUzO7+2dAfGrmrMYXlQ6+BcxJdo4s37+qvlNy9jeoZFHDzKwnYaKmv0erboiKhTPjRUbCL31TwmHF\nJE8uNcGBP5nZKgvT0QJ0cvf3o/dbgE45jC9uCOX/kebL/YPq369c3sfvE/6nGXeCmb1qZkvN7Lxo\nXbcoptqMrzq/z1zdv/OAD9z9rYR1Obt/Fb5TcvY3qGRRg8ysJfB7YJy77wJ+AfQGzgDeJxRtc+XL\n7t4XuAQYbWZfSdwY/c8op+2ozewo4HLgd9GqfLp/5eTD/aqKmd1CmLv+iWjV+8Dx7n4m8CPgSTNr\nXdXxWZS3v88KhlL+Pyw5u3+VfKeUqe2/QSWLGmJmTQi/1Cfc/RkAd//A3Q+4+0FgBocelVRnytka\n4Yemqd0KzI9i+SD+eCn6uTVX8UUuAf7h7h9EsebN/YtU937Vepxmdi1wGfCd6MuE6PHOR9H7VYR6\ngM9HsSQ+qspqfEfw+8zF/WsMXAXMS4g7J/evsu8Ucvg3qGRRA6JnnL8G3nD3nyesT3zOfyUQb3nx\nHDDEzJpamHb2REJFWbbia2FmreLvCRWha6I44q0jrgEWJMT3vaiFxTnAzoSibzaV+x9dvty/BNW9\nX4uAi8ysbfTI5aJoXVaY2cXA/wEud/e9CeuPNbOC6H0vwv16O4pxl5mdE/0Nfy/hM2Ujvur+Psum\nZo5KnUOifbPpQuBf7l72eCkX96+q7xRy+TdYEzX3Df0FfJlQHHwdWB29LgUeB/4ZrX8O6JJwzC2E\n/6EUUUMtKJLE14vQkuQ1YC1wS7S+PfBn4C1gMdAuWm/AQ1F8/wT618I9bAF8BLRJWJez+0dIWu8D\nJYTnvNcdyf0i1B2sj14jshzfesLz6fjf4C+jfa+Ofu+rgX8A30g4T3/Cl/YG4EGiUR2yFF+1f5/R\nv6M3o223ZPP+RetnAddX2DcX96+q75Sc/Q1quA8REUlJj6FERCQlJQsREUlJyUJERFJSshARkZSU\nLEREJCUlCxERSUnJQkREUlKykLxgZrdE4/a/bmHOgLOT7NvTEuYhyGcW5nAYH71flsM4snJtM3vU\nzC7LxrklvzTOdQAiZnYuYTyjvu6+38w6EOYvqFfc/Uv18NpnEuapkHpOJQvJB12Abe6+H8Ddt7n7\nexVLEGY23sxuixYbm9kTZvaGmT1tZs2jfVqY2R/N7DUzW2Nm347O868q9n82GrZ9bcLQ7ZjZ96JS\nzmtm9njC+uFmtjwq/fwqPmZQoqiU9KaZ/RU4KWH9nuhnPJ5Z0X5PmNmFZvY3C7OZnZXsetHxb5jZ\njCjuP5lZs8o+eyXX/lG0bY2ZjUvYXuk5K/lsnzezv1qYHe4WoLMnjKMk9VhNjbWil15H+gJaEsa+\neRN4GPhqtL4n5WdaG0/4X2xPwrg5A6L1M4lmYCOM4zMj4Zg2KfaPj63TjDDGT3vgC1EsHSrscwrw\nPNAkWn4Y+F6Fz9KPMDZPc6A1YTye+LX2JHyuUuB0wn/YVkUxGWESm2eTXS/h+DOi9U8Bwyv77Anv\n9yTE1iK652uBMyvEVO6cFT5b0+iYsxLi+XOu/370qp2XShaSc+4e/yIbBXwIzLMw1HYym9z9b9H7\n2YSB1yB8GX7dzO42s/PcfWeK/ceY2WuEmeWOI4woegHwO3ffFsUXn1Hta1GcKyzMz/w1wiCNic4D\n5rv7Xg/zD1Q1Suq/3f2fHobrXkv40vUo/p5pXO/f7r46er8qOqaqzx735Si2T6J7/kwUb2JMFc+Z\n6ApgpbvHR/hdSxicUhoA1VlIXnD3A0AhUGhm/yQMv7yY8o9Kj048pOIpovO8aWGy+kuBn5rZnwnT\nXR62v5nFCENSn+vue82ssMI1KjLgt+4+sRofrSr7E94fTFg+yKF/l5Vez8LMaYnHHwCaVfbZ3X3K\nEcZ0gFDaSnQ6IYnE9SP8zqQBUMlCcs7MTjKzExNWnQFsBD4AOppZezNrSqgEjzs+qhgHGAb8NTpX\nV2Cvu88G/hvom2T/NsDHUaI4mTDRPcDLwDfNrH10znbR+j8Dg82sY3y9mfWo8HH+AlwR1SG0Ar5x\nJPekGtcrk+Szx/2/KLbmFuY1uTJal66PgNOia/UjzD+ikkUDoZKF5IOWwANmdgzhufl6YJS7l5jZ\nFMJEOJuBfyUcU0SYHnYmsI4wZSeE//3+t5kdJMxV8L+T7H8AuN7M3oi2vwLg7mvN7E5gqZkdAF4F\nrnX3dWY2iTCXeaPo/KMJiY3o2H+Y2TzCl+hWwgQ+RyTJ9bZUcUhVnz0xtlkcmijqUXd/tRohPQ4s\njB6JFQE7CPdSGgDNZyH1XvTY5g/uflqOQxGps/QYSkREUlLJQkREUlLJQkREUlKyEBGRlJQsREQk\nJSULERFJSclCRERSUrIQEZGUlCxERCSl/x9VpjmfYURC3QAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7f462a953c10>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig, ax = subplots(figsize=(6,5) )\n",
    "  \n",
    "font = {'size'   : 12}\n",
    "matplotlib.rc('font', **font)\n",
    "\n",
    "\n",
    "plot(dim[:30], Rs[:30,1], 'o', mec='b', mfc=(.8,.8,1), ms=10)\n",
    "plot(dim_solved, acc_solved, 'o', mec='b', mfc='b', ms=10)\n",
    "axhline(test_acc_bl, ls='-', color='k',label='baseline')\n",
    "axhline(test_acc_bl * .9, ls=':', color='k',label='solved')\n",
    "plt.legend()\n",
    "ax.set_xlabel('Subspace dimension $d$')\n",
    "ax.set_ylabel('Validation accuracy')\n",
    "\n",
    "# ax.set_title('width %d, depth %d' %(width[i], depth[j]))\n",
    "plt.grid()\n",
    "# ax.set_ylim([0.3,0.7])\n",
    "        \n",
    "fig.savefig(\"figs/lenet_mnist_dim.pdf\", bbox_inches='tight')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\nIiIpUzIREalHpXOP1LWPPvoIM2P37t11fu59oWQiIiIpUzIREZGUKZmIiNTC7bffTs+ePWnXrh1H\nHHEEf/nLX9ixYwcTJ06kR48e9OjRg4kTJ7Jjx45Kjz3vvPPKrZswYQLjx48HwqjBl1xyCd27d6dn\nz57ccMMNZfOQlJSUMGnSJDp37swhhxzCn/70p/r/sLWgZCIiWS0WizFz5kwAdu3aRSwWY9asWQBs\n3bqVWCzGnDlzgPBjHIvFmDt3LgDr168nFosxb948IEx1G4vFePHFF4Hyc5NEsXz5cu677z4WL17M\n5s2beemll+jTpw+33nor//znP1m6dClvvfUWixYt4pZbbqlw/IgRI3jhhRfYvHkzEBLEk08+yahR\no4Awz3uzZs344IMPePPNN3n55Zf53e9+B8CMGTN4/vnnefPNN1myZAlPP/10rWKvb0omVSgshAkT\n4NxzT6ZpU+jSJSwXFmY6MhHJlKZNm7Jjxw7effdddu3aRZ8+fejbty+PPfYYN954I126dOGAAw7g\nF7/4BY8++miF4w866CCOP/54nnnmGQBeffVVWrduzUknncTatWt54YUXmDp1Km3atKFLly5cddVV\nZdPtPvnkk0ycOLFsyuDrr78+rZ+9Jpq2txLz58Po0TB0KDz8cDO6dYM1ayA/H048EWbNgiFDMh2l\nSG4oKCgoe928efNyy61bty633L59+3LLnTt3LrfcrVu3csuJU/BGceihhzJ16lRuuukmli1bxuDB\ng7nrrrv45JNPyk2zWzqdb2VGjRrF7NmzufDCC3n88cfLrkpWrFjBrl276N69e9m+e/bsKYvxk08+\nqTBlcDbRlUmSwsKQSO64Ay6/HHr1gmbNwvPll4f1o0frCkUkV40aNYq///3vrFixAjPj2muvpUeP\nHqxYsaJsn9LpfCvz3e9+l4KCAlatWsUzzzxTlkx69+5NixYtWL9+fdl0u5s2bSqbhbF79+4VpgzO\nJkomSaZNC1ck/ftXvr1//7D93nvTG5eIZN7y5ct59dVX2bFjBy1btqRVq1Y0adKEkSNHcsstt/DZ\nZ5+xfv16Jk+ezOjRoys9xwEHHEAsFmPMmDEcfPDBZRNSde/endNOO41rrrmGTZs2sWfPHgoLC1mw\nYAEA3/ve95g2bRqrVq3iiy++YMqUKWn73FEomSSZPTski+oMHQqPP56eeEQke+zYsYPrrruOzp07\n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\nrkJggg==\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7f462a969b10>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig, ax = subplots(figsize=(6,5) )\n",
    "  \n",
    "font = {'size'   : 12}\n",
    "matplotlib.rc('font', **font)\n",
    "\n",
    "\n",
    "plot(dim, Rs[:,1], 'o', mec='b', mfc=(.8,.8,1), ms=10)\n",
    "plot(dim_solved, acc_solved, 'o', mec='b', mfc='b', ms=10)\n",
    "axhline(test_acc_bl, ls='-', color='k',label='baseline')\n",
    "axhline(test_acc_bl * .9, ls=':', color='k',label='solved')\n",
    "plt.legend()\n",
    "ax.set_xlabel('Subspace dimension $d$')\n",
    "ax.set_ylabel('Validation accuracy')\n",
    "\n",
    "# ax.set_title('width %d, depth %d' %(width[i], depth[j]))\n",
    "plt.grid()\n",
    "# ax.set_ylim([0.3,0.7])\n",
    "        \n",
    "fig.savefig(\"figs/lenet_mnist_dim.pdf\", bbox_inches='tight')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(0.0, 0.5)"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7f462889d810>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "nn = len(Rs)\n",
    "fig, ax = subplots(figsize=(5,4) )\n",
    "                  \n",
    "plt.scatter(dim[1:], Rs[1:,0], edgecolor=\"k\", facecolor=\"w\" )\n",
    "ax.plot(dim, R_dir[0]*np.ones(nn)/0.9,'r-.', label=\"Testing: baseline\")\n",
    "\n",
    "plot(dim, Rs[:,0], 'o', mec='b', mfc=(.8,.8,1), ms=10)\n",
    "axhline(R_dir[0], ls='-', color='k',label='baseline')\n",
    "axhline(R_dir[0] / .9, ls=':', color='k',label='solved')\n",
    "\n",
    "ax.set_xlabel('Subspace dimension $d$')\n",
    "ax.set_ylabel('Validation NLL')\n",
    "plt.grid()\n",
    "ax.set_ylim([0.0,0.5])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 2",
   "language": "python",
   "name": "python2"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.12"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
